hadoop
hadoop版本
-
Hadoop1.0:包括Common、HDFS、MapReduce
-
Hadoop2.0:包括Common、HDFS、MapReduce、YARN。Hadoop1.0和Hadoop2.0不兼容。从Hadoop2.7版本开始,包含了Ozone,从Hadoop2.10版本开始,包含了Submarine
-
Hadoop3.0:包括了Common、HDFS、MapReduce、YARN以及Ozone模块,最新的Hadoop3.0版本中包含了Submarine
hadoop模块
1. Hadoop Common:用于支持其他模块
- Hadoop Distributed File System (HDFS™):分布式存储
- Hadoop YARN:任务调度和资源管理
- Hadoop MapReduce:基于YARN的分布式计算框架
- Hadoop Ozone:对象存储
- Hadoop Submarine:机器学习引擎
hadoop安装
单机安装及配置
- Hadoop伪分布式安装.txt
- Hadoop完全分布式搭建.txt
Hadoop2.0和Hadoop3.0的区别
HDFS
图解
namenode
-
作用
- 管理DataNode和存储元数据(metadata)
-
元数据
-
a. 文件的存储路径 b. 文件的权限 c. 文件大小 d. Block大小 e. 文件和BlockID的映射关系 f. BlockID和DataNode的映射关系 g. 副本数量
-
元数据和文件中的具体内容无关
-
元数据大小是130~180B
-
a. 维系在内存中的目的是为了读写快 b. 维系在磁盘中的目的是为 了崩溃恢复
-
在磁盘上的存储文件
- edits:操作文件。记录写操作
- fsimage:元镜像文件。记录元数据,这个文件中的元数据往往是落后于内存中的元数据的
-
-
元数据的存储路径由hadoop.tmp.dir属性来决定,不指定或者写错则默认为/tmp下
-
当NameNode收到写请求,会先将这个请求写到edits_inprogress文件中,如果记录成功则更新内存中的元数据,如果内存中的元数据更新成功则给客户端返回一个ack(确认字符)表示成功,在这个过程中没有改动fsimage
-
随着HDFS运行时间的增长,edits_inprogress会越来越大,同时fsimage和内存中元数据的差距越来越大,需要在适当的时机更新fsimage,edits_inprogress文件会滚动,滚动出一个edits文件以及产生一个新的edits_inprogress
- 空间:当edits文件达到指定大小(默认是64M,可以通过fs.checkpoint.size来调节,单位是字节)的时候,会滚动产生一个新的edits_inprogress
- 时间:当距离上一次滚动的间隔时间达到指定条件(默认是1H,可以通过fs.checkpoint.period来调节,单位是秒)的时候,会滚动产生一个新的edits_inprogress
- 强制:hadoop dfsadmin -rollEdits
- 重启:当NameNode重启的时候会自动触发edits文件的滚动
-
NameNode通过心跳机制来管理DataNode
-
默认心跳的间隔时间是3s,这个属性可以通过dfs.heartbeat.interval来调节,单位是秒
-
当NameNode超过10min没有收到DataNode的心跳,则认为这个节点已经lost(丢失),NameNode会将这个节点上的数据备份到其他节点上保证整个集群中的副本数量
-
心跳信号
- 当前DataNode的状态(预服役、服役、预退役、退役)
- DataNode中BlockID
- clusterID - 集群编号。clusterID在NameNode被格式化(hadoop namenode -format)的时候产生,NameNode在启动的时候会将clusterID发送给每一个DataNode,当DataNode在发送心跳的时候需要携带这个clusterID来进行校验的。DataNode只接受一次clusterID
-
-
NameNode/HDFS重启,会触发edits_inprogress文件的滚动,将操作更新到fsimage中,然后将fsimage文件中的内容加载到内存中,加载完成之后会等待DataNode的心跳,收到心跳之后进行校验,如果校验失败,NameNode会试图恢复这些数据然后重新校验,这个过程称之为安全模式。直到校验成功,NameNode会自动退出安全模式
- 如果在合理时间内,安全模式没有退出,那么就意味着产生了数据的丢失,需要强制退出安全模式:hadoop dfsadmin -safemode leave
-
datanode
-
block:数据将会按照指定的大小来分块
-
分块的意义:1)能够存储超大文件 2)能够快速备份
-
作用
- 存储Block,将Block存储在DataNode的磁盘上
-
DataNode会定时向NameNode发送心跳信号 Block在磁盘上的存储位置由hadoop.tmp.dir来决定
-
默认为128M,通过dfs.blocksize(hdfs-site.xml)属性来配置,单位是字节
-
如果一个文件不足一个Block的默认大小,那么这个文件大小为实际大小
-
HDFS会对每一个Block分配一个全局递增的编号 - Block ID: 1073741825
-